package main

/*
* Content: 设计模式-单例模式
* --------------------------------------------------
* golang 设计模式-单例模式: https://juejin.cn/post/7124720007447052302
 */

import (
	"fmt"
	"log"
	"sync"
	"time"
)

type Singleton struct {
	Name string
}

var (
	instance *Singleton
	lock2    sync.Mutex
)

// 双重检查锁
func GetInstance() *Singleton {
	if instance == nil { // 重要
		lock2.Lock()         // 重要
		defer lock2.Unlock() // 重要
		if instance == nil { // 重要
			instance = &Singleton{Name: "谢清照"}
		}
	}
	return instance
}

func MySinglePattern() {

	// 设计模式-单例模式
	fmt.Println("--------------------设计模式-单例模式-------------------")

	for i := 0; i < 5; i++ {
		go func() {
			newSinle := GetInstance()
			log.Printf("the value is : %s", newSinle.Name)
		}()
	}
	time.Sleep(time.Second)
}
